// 搭建网站服务器，实现客户端与服务器端的通信
// 连接数据库，创建用户集合，向集合中插入文档
// 当用户访问/list时，将所有用户信息查询出来
// 将用户信息和表格HTML进行拼接并将拼接结果响应回客户端
// 当用户访问/add时，呈现表单页面，并实现添加用户信息功能
// 当用户访问/modify时，呈现修改页面，并实现修改用户信息功能
// 当用户访问/delete时，实现用户删除功能

// 引入http模块创建服务器
const http = require('http');
// 创建服务器
const app = http.createServer();
// 引入url模块处理get请求
const url = require('url');
// 引入模板引擎模块
const template = require('art-template');
// 引入path模块
const path = require('path');
// 引入querystring模块处理post请求参数
const querystring = require('querystring');
// 引入用户集合规则
const User = require('./model/user.js');
// 连接数据库
require('./model/db');

// 配置模板引擎模板根路径
template.defaults.root = path.join(__dirname, 'views');
// 配置模板引擎文件默认后缀
template.defaults.extname = '.art';


app.on('request', async (req, res) => {
    const method = req.method;
    let { pathname, query } = url.parse(req.url, true);
    // GET请求
    if (method === 'GET') {
        // 响应用户列表页面
        if (pathname === '/' || pathname === '/list') {
            // 查询用户列表
            let users = await User.find({});
            // 渲染用户列表
            let html = template('list', {
                data: {
                    users: users
                }
            });
            res.end(html);
        } else if (pathname === '/add') {
            // 响应添加用户页面
            let html = template('add', {
                data: {
                    operation: 'addUser'
                }
            });
            res.end(html);
        } else if (pathname === '/update') {
            // 响应修改用户页面
            let { id } = query;
            // 根据id查询用户信息
            let user = await User.findOne({ _id: id });
            let html = template('add', {
                data: {
                    operation: 'updateUser',
                    user: user
                }
            });
            res.end(html);
        } else if(pathname === '/deleteUser') {
            // 删除用户请求
            let id = query.id;
            User.remove({_id: id}).then(result => {
                console.log(result);
                res.writeHead(301, {
                    location: '/list'
                });
                res.end();
            }).catch(err => {
                console.log(err);
                res.writeHead(400, { 'content-type': 'text/html;charset=utf-8' });
                res.end('删除用户失败！');
            })
        }
    } else if (method === 'POST') {
        // POST请求
        let content = '';
        // 数据接收开始
        req.on('data', param => {
            content += param;
        });
        // 数据接收结束
        req.on('end', () => {
            // 添加用户请求
            if (pathname === '/addUser') {
                // 向数据库中插入数据
                User.create(querystring.parse(content)).then(result => {
                    console.log(result);
                    res.writeHead(301, {
                        location: '/list'
                    });
                    res.end();
                }).catch(err => {
                    console.log(err);
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});
                    res.end('数据操作失败，请检查参数！');
                })
            } else if(pathname == '/updateUser') {
                // 修改用户请求
                User.updateOne({_id: query.id}, querystring.parse(content)).then(result => {
                    console.log(result);
                    res.writeHead(301, {
                        location: '/list'
                    });
                    res.end();
                }).catch(err => {
                    console.log(err);
                    res.writeHead(400, { 'content-type': 'text/html;charset=utf-8' });
                    res.end('更新数据失败，请检查参数！');
                })
            }
        });
    }
});

// 监听3000 端口
app.listen(3000);
console.log('服务器已启动，请访问3000端口！');
